/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pt.ipleiria.estg.es1.minesfinder;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JOptionPane;

/**
 *
 * @author pedro.ferreira
 */
public class JanelaDeJogo extends javax.swing.JFrame {

    
    private BotaoCampoMinado[][] botoes;
    private CampoMinado campoMinado;
    private TabelaRecords records;
    /**
     * Creates new form JanelaDeJogo
     */
    public JanelaDeJogo(CampoMinado campo, TabelaRecords tabela) {
        initComponents();     
        this.campoMinado=campo;
        this.records = tabela;        
        botoes = new BotaoCampoMinado[campoMinado.getLargura()][campoMinado.getAltura()];
        
        getContentPane().setLayout(new java.awt.GridLayout(campoMinado.getAltura(), campoMinado.getLargura()));
        
            ActionListener action=new ActionListener() {         
                @Override         
                public void actionPerformed(ActionEvent e) {             
                    BotaoCampoMinado botao = (BotaoCampoMinado) e.getSource();             
                    int x = botao.getColuna();             
                    int y = botao.getLinha();
                    campoMinado.revelarQuadricula(x,y);
                    actualizarEstadoBotoes();
                    
                    if (campoMinado.isJogoTerminado()) {         
                        if (campoMinado.isJogadorDerrotado())             
                            JOptionPane.showMessageDialog(null, "Oh, rebentou uma mina", "Perdeu!", JOptionPane.INFORMATION_MESSAGE);         
                        else{             
                            JOptionPane.showMessageDialog(null, "Parabéns. Conseguiu descobrir todas as minas em "+                     
                                    (campoMinado.getDuracaoJogo()/1000)+" segundos", "Vitória", JOptionPane.INFORMATION_MESSAGE);         
                            
                            if(campoMinado.getDuracaoJogo()<records.getRecord())
                            {
                                String nome = JOptionPane.showInputDialog("Introduza o seu nome");
                                records.setRecord(campoMinado.getDuracaoJogo(), nome);
                            }
                        }
                        setVisible(false);     
                    } 
                }     
            };
            
            MouseListener mouseListener=new MouseListener() {     
                @Override     
                public void mouseClicked(MouseEvent e) {     
                }  
                
                @Override     
                public void mousePressed(MouseEvent e) {         
                    if (e.getButton()==MouseEvent.BUTTON3) {             
                        BotaoCampoMinado botao = (BotaoCampoMinado) e.getSource();             
                        int x = botao.getColuna();             
                        int y = botao.getLinha();             
                        if (campoMinado.getEstadoQuadricula(x, y)==CampoMinado.TAPADO)                 
                            campoMinado.marcarComoTendoMina(x, y);             
                        else if (campoMinado.getEstadoQuadricula(x, y)==CampoMinado.MARCADO)                 
                            campoMinado.marcarComoSuspeita(x, y);             
                        else if (campoMinado.getEstadoQuadricula(x, y)==CampoMinado.DUVIDA)                 
                            campoMinado.desmarcarQuadricula(x, y);             
                        actualizarEstadoBotoes();         
                    }     
                }  
    
                @Override     
                public void mouseReleased(MouseEvent e) {     
                }  
                @Override     
                public void mouseEntered(MouseEvent e) {     
                }  
                @Override     
                public void mouseExited(MouseEvent e) {     
                }
            };

            KeyListener keyListener = new KeyListener() {
                @Override     
                public void keyTyped(KeyEvent e) {     
                }  
            
                @Override     
                public void keyPressed(KeyEvent e) {         
                    BotaoCampoMinado botao = (BotaoCampoMinado) e.getSource();         
                    int x = botao.getColuna();         
                    int y = botao.getLinha();         
                    if (e.getKeyCode() == KeyEvent.VK_UP && y > 0) {             
                        botoes[x][y - 1].requestFocus();         
                    } else if (e.getKeyCode() == KeyEvent.VK_LEFT && x > 0) {             
                        botoes[x - 1][y].requestFocus();         
                    } else if (e.getKeyCode() == KeyEvent.VK_DOWN && y < campoMinado.getAltura() - 1) {             
                        botoes[x][y + 1].requestFocus();         
                    } else if (e.getKeyCode() == KeyEvent.VK_RIGHT && x < campoMinado.getLargura() - 1) {             
                        botoes[x + 1][y].requestFocus();         
                    } else if (e.getKeyCode()==KeyEvent.VK_M) {                      
                        marcarQuadricula(x,y);
                        actualizarEstadoBotoes();         
                    }     
                }
                
                @Override     
                public void keyReleased(KeyEvent e) {     
                }
            };
            
         // Criar e adicionar os botões à janela
        for (int y=0; y<campoMinado.getAltura(); y++) {
            for (int x=0; x<campoMinado.getLargura(); x++) {
                botoes[x][y]=new BotaoCampoMinado(x,y);
                botoes[x][y].addActionListener(action);
                botoes[x][y].addMouseListener(mouseListener);                
                botoes[x][y].addKeyListener(keyListener);                                
                getContentPane().add(botoes[x][y]);
            }
        }
    }
    
    private void actualizarEstadoBotoes() {     
        for (int x = 0; x < campoMinado.getLargura(); x++) {         
            for (int y = 0; y < campoMinado.getAltura(); y++) {             
                botoes[x][y].setEstado(campoMinado.getEstadoQuadricula(x, y));         
            }     
        } 
    }

    private void marcarQuadricula(int x, int y){
        if (campoMinado.getEstadoQuadricula(x, y)==CampoMinado.TAPADO)                 
            campoMinado.marcarComoTendoMina(x, y);             
        else if (campoMinado.getEstadoQuadricula(x, y)==CampoMinado.MARCADO)                 
            campoMinado.marcarComoSuspeita(x, y);             
        else if (campoMinado.getEstadoQuadricula(x, y)==CampoMinado.DUVIDA)                 
            campoMinado.desmarcarQuadricula(x, y);   
    }
    
    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 400, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 300, Short.MAX_VALUE)
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents


    // Variables declaration - do not modify//GEN-BEGIN:variables
    // End of variables declaration//GEN-END:variables
}
